package com.skyyan.netty.jjf.util;

import cn.hutool.core.util.ByteUtil;

/**
 * Int与3字节小端序数组互转工具类
 *
 * 该工具类处理int值的低3个字节（共4字节），以小端序（Little-Endian）格式进行转换。
 * 小端序：最低有效字节（LSB）存储在数组的最前面（索引0）。
 *
 * 示例：
 *   int值: 0x12345678
 *   低3字节小端序数组: [0x78, 0x56, 0x34] (丢弃了最高字节 0x12)
 */
public class IntThreeBytesUtil {

    /**
     * 将int值的低3个字节转换为小端序（低位在前）的3字节数组。
     *
     * @param value 要转换的int值
     * @return 长度为3的byte数组，包含value的低3个字节，按小端序排列
     */
    public static byte[] intTo3BytesLittleEndian(int value) {
        byte[] result = new byte[3];
        // 小端序：低位字节在前
        result[0] = (byte) (value & 0xFF);         // 最低字节 (LSB)
        result[1] = (byte) ((value >> 8) & 0xFF);  // 中间字节
        result[2] = (byte) ((value >> 16) & 0xFF); // 次高字节 (丢弃最高字节)
        return result;
    }

    /**
     * 将小端序（低位在前）的3字节数组转换为int值。
     * 数组中的字节被视为结果int值的低3个字节，最高字节补0。
     *
     * @param bytes 长度为3的byte数组，按小端序排列
     * @return 重建的int值
     * @throws IllegalArgumentException 如果输入数组长度不为3
     */
    public static int threeBytesLittleEndianToInt(byte[] bytes) {
        if (bytes == null) {
            throw new IllegalArgumentException("输入字节数组不能为null");
        }
        if (bytes.length != 3) {
            throw new IllegalArgumentException("输入字节数组长度必须为3，实际长度: " + bytes.length);
        }

        // 小端序：数组索引0是最低有效字节
        return (bytes[0] & 0xFF) |           // 最低字节
                ((bytes[1] & 0xFF) << 8) |    // 中间字节
                ((bytes[2] & 0xFF) << 16);    // 次高字节 (最高字节为0)
    }

    // --- 可选：使用Hutool辅助打印的工具方法 ---

    /**
     * 将byte数组格式化为十六进制字符串，便于调试和日志输出。
     *
     * @param bytes 要格式化的字节数组
     * @return 格式化的十六进制字符串，如 "A1 B2 C3"
     */
    public static String bytesToHex(byte[] bytes) {
        if (bytes == null) {
            return "null";
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < bytes.length; i++) {
            if (i > 0) {
                sb.append(" ");
            }
            sb.append(String.format("%02X", bytes[i] & 0xFF));
        }
        return sb.toString();
    }

    // --- 使用示例 (main方法) ---
    public static void main(String[] args) {
        // 测试用例1
        int originalValue1 = 0x12345678;
        System.out.println("=== 测试用例 1 ===");
        System.out.println("原始 int 值 (十六进制): " + Integer.toHexString(originalValue1).toUpperCase());
        System.out.println("原始 int 值 (十进制): " + originalValue1);

        byte[] threeBytes1 = intTo3BytesLittleEndian(originalValue1);
        System.out.println("转换为3字节小端序: " + bytesToHex(threeBytes1)); // 输出: 78 56 34

        int reconstructed1 = threeBytesLittleEndianToInt(threeBytes1);
        System.out.println("重建的 int 值 (十六进制): " + Integer.toHexString(reconstructed1).toUpperCase());
        System.out.println("重建的 int 值 (十进制): " + reconstructed1);
        System.out.println("转换正确: " + (originalValue1 == (reconstructed1 | 0xFF000000))); // 注意：高位被丢弃，所以比较时需要屏蔽高位
        System.out.println();

        // 测试用例2: 较小的值
        int originalValue2 = 0x0000ABCD;
        System.out.println("=== 测试用例 2 ===");
        System.out.println("原始 int 值 (十六进制): " + Integer.toHexString(originalValue2).toUpperCase());
        System.out.println("原始 int 值 (十进制): " + originalValue2);

        byte[] threeBytes2 = intTo3BytesLittleEndian(originalValue2);
        System.out.println("转换为3字节小端序: " + bytesToHex(threeBytes2)); // 输出: CD AB 00

        int reconstructed2 = threeBytesLittleEndianToInt(threeBytes2);
        System.out.println("重建的 int 值 (十六进制): " + Integer.toHexString(reconstructed2).toUpperCase());
        System.out.println("重建的 int 值 (十进制): " + reconstructed2);
        System.out.println("转换正确: " + (originalValue2 == reconstructed2)); // 此时高位为0，完全相等

        int value=8890;
        System.out.println("原始 int 值  : " + value);
        byte[] bytes = IntThreeBytesUtil.intTo3BytesLittleEndian(value);
        System.out.println("HEX:"+IntThreeBytesUtil.bytesToHex(bytes));
        System.out.println("转换成int="+IntThreeBytesUtil.threeBytesLittleEndianToInt(bytes));

    }
}
